package com.njtech.pet.controller;

import com.alibaba.fastjson.JSON;
import com.njtech.pet.constant.Constant;
import com.njtech.pet.entity.Message;
import com.njtech.pet.entity.User;
import com.njtech.pet.service.FriendService;
import com.njtech.pet.service.MessageService;
import com.njtech.pet.service.UserService;
import com.njtech.pet.vo.MessageShow;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.SessionAttribute;

import java.util.List;

/**
 * Author:gm
 * Date:2020-03-22 20:30
 * Description:<描述>
 *     具体怎么作待考虑
 */
@Controller
@RequestMapping("/message")
public class MessageController {
    @Autowired
    UserService userService;
    @Autowired
    MessageService messageService;
    @Autowired
    FriendService friendService;

    /*******************************
     * 1.聊天记录：查找一个时间段的聊天记录
     * @return  消息集
     * -------------------------完成
     */
    @RequestMapping("/selectMessage")
    @ResponseBody
    public String selectMessage(Integer sid,Integer rid, String beginDate,String endDate){
        //设置发送方和接收方的用户
        User sender = new User();
        sender.setId(sid);
        User receiver = new User();
        receiver.setId(rid);
        List<Message> messageList = messageService.selectByCoupleUsersBetweenDates(sender,receiver,beginDate,endDate);
        return JSON.toJSONString(messageList);
    }

    /**
     * 2.未读消息:在用户B点击进入对话框是时，显示所有
     * 使用场景：当用户刚进入chat界面时，调用并显示和该用户聊天的最后一条消息及未读消息
     *          ws中可以使用对应服务，一旦有新的聊天或售后或咨询或客服广播消息，
     *          (再想想怎么处理)
     * @param uid  用户A的id
     *   用户B的id  此用户做点击事件触发函数
     * @return     未读消息集合：用于未读消息数量判断，和对话框未读消息显示
     */
    @RequestMapping("/selectUnRead")
    @ResponseBody
    public String selectUnRead(@SessionAttribute(value = "uid") Integer uid){
        List<MessageShow> messageList =  messageService.selectUnRead(uid);
        System.out.println(messageList);
        return JSON.toJSONString(messageList);
    }

    /***********************************************************
     * 3.更新消息的状态
     * 使用场景：在用户点击进入对话框时，对状态为未读的每条消息根据消息id号将状态标记为已读
     * @param mid
     * @return  提示信息
     * */
    @RequestMapping("/updateState")
    @ResponseBody
    public String updateState(Integer mid){
        Message message = new Message();
        message.setId(mid);
        message.setState(Constant.Message.STATE_READ.getValue());
        messageService.updateMessageStateByMessageId(message);
        return "";
    }

    /**
     * 点击一个好友进入当前用户和好友的对话框时，将未读message的状态修改
     * @param uid   当前操作的用户id
     * @param rid  对方id
     * @return
     */
    @RequestMapping("/changeStates")
    @ResponseBody
    public String changeStates(Integer uid,Integer rid){
       messageService.changeState(uid,rid);
        return "";
    }

    /*****************************
     * 4.查找一对用户所有的消息
     * 使用场景：chat界面点击一个用户进入对话框时调用，在对话框显示两者的所有消息
     * @param sid  当前用户
     * @param rid  对方用户
     * @return     消息集合
     * -----------------------完
     */
    @RequestMapping("/selectAll")
    @ResponseBody
    public String selectAll(@SessionAttribute(value = "uid") Integer sid,Integer rid){
        return JSON.toJSONString(messageService.selectAll(sid,rid));
    }

    /**
     * 将当前用户的好友请求消息和未读消息的个数返回
     * 用于长轮询
     * @param uid  当前用户id
     * @return     数量分三种情况
     */
    @RequestMapping("/longSearch")
    @ResponseBody
    public String longSearch(@SessionAttribute(value = "uid") Integer uid){
        String count  = messageService.longSearch(uid);
        return count;
    }

    /**
     * 找最近一条A--》B的未读消息
     * @param sid
     * @param rid
     * @return
     */
    @RequestMapping("/findAMessageByBoth")
    @ResponseBody
    public String findAMessageByBoth(Integer sid,Integer rid){
        Message message = messageService.findAMessageByBoth(sid,rid);
        return JSON.toJSONString(message);
    }

}
